package org.nutz.dao.impl.sql;

import org.nutz.dao.entity.Entity;
import org.nutz.dao.jdbc.JdbcExpert;
import org.nutz.dao.sql.Pojo;
import org.nutz.dao.sql.PojoMaker;
import org.nutz.dao.sql.SqlType;
import org.nutz.dao.util.Pojos;

public class NutPojoMaker implements PojoMaker {

	private JdbcExpert expert;

	public NutPojoMaker(JdbcExpert expert) {
		this.expert = expert;
	}

	public Pojo makePojo(SqlType type) {
		Pojo pojo = expert.createPojo(type);

		return pojo;
	}

	public Pojo makeInsert(Entity<?> en) {
		Pojo pojo = Pojos.pojo(expert, en, SqlType.INSERT);
		pojo.setEntity(en);
		pojo.append(Pojos.Items.entityTableName());
		pojo.append(Pojos.Items.insertFields());
		pojo.append(Pojos.Items.insertValues());
		return pojo;
	}

	public Pojo makeUpdate(Entity<?> en, Object refer) {
		Pojo pojo = Pojos.pojo(expert, en, SqlType.UPDATE);
		pojo.setEntity(en);
		pojo.append(Pojos.Items.entityTableName());
		pojo.append(Pojos.Items.updateFields(refer));
		return pojo;
	}

	public Pojo makeQuery(Entity<?> en) {
		Pojo pojo = Pojos.pojo(expert, en, SqlType.SELECT);
		pojo.setEntity(en);
		pojo.append(Pojos.Items.queryEntityFields());
		pojo.append(Pojos.Items.wrap("FROM"));
		pojo.append(Pojos.Items.entityViewName());
		return pojo;
	}

	public Pojo makeQuery(String tableName) {
		String[] ss = tableName.split(":");
		//String idFieldName = ss.length > 1 ? ss[1] : "*";//按id字段来统计,比较快
		Pojo pojo = makePojo(SqlType.SELECT);
		//pojo.append(Pojos.Items.wrap(idFieldName));//与org.nutz.dao.test.normal.QueryTest.query_records_pager()冲突
		pojo.append(Pojos.Items.wrap("*"));
		pojo.append(Pojos.Items.wrap("FROM"));
		pojo.append(Pojos.Items.wrap(ss[0]));
		return pojo;
	}

	public Pojo makeDelete(Entity<?> en) {
		Pojo pojo = Pojos.pojo(expert, en, SqlType.DELETE);
		pojo.setEntity(en);
		pojo.append(Pojos.Items.wrap("FROM"));
		pojo.append(Pojos.Items.entityTableName());
		return pojo;
	}

	public Pojo makeDelete(String tableName) {
		Pojo pojo = makePojo(SqlType.DELETE);
		pojo.append(Pojos.Items.wrap("FROM"));
		pojo.append(Pojos.Items.wrap(tableName));
		return pojo;
	}

	public Pojo makeFunc(String tableName, String funcName, String colName) {
		Pojo pojo = makePojo(SqlType.SELECT);
		pojo.append(Pojos.Items.wrapf("%s(%s) FROM %s", funcName, colName, tableName));
		return pojo;
	}

}
